共计 3595 个字符,预计需要花费 9 分钟才能阅读完成。
一.django ORM 简介
1. 什么是 ORM
- ORM : 全称 object relational mapping, 对象关系映射
- 功能 : 通过 orm 实现使用操作对象的方式来操作数据库中的数据
- 目的 : 就是为了能够让不懂 SQL 语句的人通过 python 面向对象的知识点也能够轻松自如的操作数据库
- 缺陷 : sql 封装死了, 有时候查询速度很慢
2.ORM 与数据库的映射关系
ORM DB
类 --------------------> 表
对象 --------------------> 数据行
属性 --------------------> 字段
二.ORM 的基本使用
1. 创建类(表)
- 我们的模型类需要写在应用下的
models.py
文件中
from django.db import models
class Student(models.Model):
"""
CharField 类型必须设置 max_length 参数
verbose_name 是对字段的解释, 每个字段都有, 且是第一个默认形参, 所以可以直接在第一个位置实参处写值不需要写 verbose_name=
null=True 允许字段为空
default=0 设置默认值
"""
# id int primary key auto_increment;(sql 语句效果与下面 orm 语句相同)
id = models.AutoField(primary_key=True,verbose_name=" 主键 ID")
# name varchar(32);
name = models.CharField(max_length=32,verbose_name=" 名字 ")
# age int;
age = models.IntegerField(verbose_name=" 年龄 ")
# pwd int;
pwd = models.IntegerField(" 密码 ",null=True)
is_delete = models.IntegerField(default=0)
- 针对主键字段说明
如果你不指定主键 那么 orm 会自动帮你创建一个名为 id 的主键字段
如果你想让主键字段名不叫 id, 儿叫叫 uid、sid、pid 等其他名字则需要自己手动指定
2. 数据库迁移命令
- 凡是对
models.py
中跟数据库相关的代码进行了更改就必须在项目目录下执行两条命令 - 这两条命令叫数据库迁移命令, 就比如上面我们创建了一个模型类, 于是我们就要进行这两条命令
# 1. 生成数据库同步脚本, 将数据库修改操作先记录下来(对应应用下的 migrations 文件夹)
python3 manage.py makemigrations
# 2. 真正的数据库迁移操作
python3 manage.py migrate
- margrations 文件夹下生成的文件
- 再看数据库已经生成了表
3. 字段的增删改查
- 增 : 添加字段代码然后迁移数据库即可
sex = models.CharField('性别',max_length=16)
height = models.IntegerField('身高 cm',null=True) # 可以为空
- 删 : 注释掉代码然后执行数据库迁移命令即可(删除字段对应的数据也将删除)
- 改 : 直接改代码然后执行数据库迁移命令即可
- 查 : 鼠标点点点
4. 数据的增删改查
- 增加数据
# 假设获取到用户传入的数据
username = "shawn"
userpwd = 123
userage = 23
# insert into Student(name,age,pwd) values(username,userpwd,age);
# 方式一 :
user_obj.models.Student.objects.create(name=username,pwd=passwd,age=userage)
# 方式二 :
user_obj = models.Student(name=username,pwd=passwd,age=userage)
user_obj.save()
- 查询数据
# select * from Student where name=usernamr
# 方式一 :
user_obj = models.User.objects.filter(name=username)[0]
# 方式二 :
user_obj = models.User.objects.filter(name=username).first()
# 推荐使用.first(). 但是其内部使用的也是通过索引取值
- 查询所有数据
# select * from Student;
# 方式一 :
user_obj = models.User.objects.filter()
# 方式二 :
user_obj = models.User.objects.all() # [obj1,obj2,obj3]
- 修改数据
# 方式一 :
models.Student.objects.filter(id=edit_id).update(name=username,pwd=password)
# 方式二 :
edit_obj = models.Student.objects.filter(id=edit_id).first()
edit_obj.name = username
edit_obj.pwd = password
edit_obj.save()
- 删除数据
# 直接删除
models.Student.objects.filter(id=edit_id).delete()
# 公司里删除数据并不会真正的删除, 而是在数据后面加一个字段来标志该数据有没有被删除
# 例如用 isdelete 字段来标识, 如果 isdelete=0 则未删除, 如果 isdelete=1 则表示删除
三. 补充
1. 开启多个 django 项目导致页面修改没有变化的情况
- 例如你在 cmd 命令行开启了一个 django 项目, 在 Pycharm 中又开启了一个项目, 其实一直在运行的是第一个启动起来的项目, 因为 django 默认的端口为 8000, 端口已经被占用, 后面开多少个都是无法启动的
- 解决方法 : 可以更换端口号
2. 浏览器缓存问题
- 浏览器对于访问的 HTML 页面会做缓存, 下次访问是直接使用缓存中的文件, 导致你修改文件后在页面上看不到变化
- 解决方法 : 打开浏览器 ----> 右击检查 ----> Network ----> 勾选 Disable cache
四. 编写登入验证页面
1. 需求
- 从数据库中读取数据, 然后对用户身份进行校验
- 校验成功返回字符串 "登入成功"
- 校验失败再次返回用户登入页面
2. 代码
- views.py 文件
from django.shortcuts import render,HttpResponse,redirect
def login_func(request):
from books import models # 导入数模型类文件
username = request.POST.get('username') # 获取用户输入的用户名
userpwd = request.POST.get('userpwd') # 获取用户输入的密码
if request.method == 'POST':
# 拿到匹配的数据对象, 如果匹配不到则返回 None
user_obj = models.Student.objects.filter(name=username,pwd=userpwd).first()
if user_obj:
print(user_obj.name,user_obj.pwd,user_obj.age,) # 可以打印信息查看一下
return HttpResponse(f'欢迎 {user_obj.name} 小可爱')
return render(request,'login.html') # 匹配不到重新返回登入界面
3. 注册功能
- 注册信息添加到数据库
- views.py 文件
from django.shortcuts import render,HttpResponse,redirect
def register_func(request):
from books import models
username = request.POST.get('username')
userpwd = request.POST.get('userpwd')
userage = request.POST.get('userage')
if request.method == 'POST':
user_obj = models.Student.objects.filter(name=username).first() # 判断是否存在该用户
if not user_obj:
user_obj = models.Student(name=username, pwd=userpwd, age=userage)
user_obj.save() # 进行用户数据添加并保存
return HttpResponse(f'{user_obj.name}小可爱注册成功')
return render(request, "register.html") # 如果用户存在, 则重新返回注册界面
正文完